package com.cy.pj.module.controller;

import com.cy.pj.model.pojo.RequestParameter;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.Map;

/**
 * 通过Controller处理请求中的参数
 * 1)将参数直接赋值给直接赋值给参数中的直接量变量(8种封装类+String+Date)
 * 2)将请求参数直接赋值给pojo对象(pojo对象需要提供域请求参数对应的set方法)
 * 3)将请求参数直接赋值给map对象(key/value)
 *
 * 客户端常用传参方式?
 * 1)普通方式:url?paramName1=paramValue1&paraName2=paramValue2
 * 2)rest方式:doMethod/{paramName}
 * 3)
 */
@RestController
public class ParamObjectController {//Handler
    /**以直接量的方式接受请求中的参数(方法中的参数名需要请求参数名相同)
     * http://localhost/doHandleParam01?name=tony
     * */
    @RequestMapping("/doHandleParam01")
    public String doHandleParam01(String name){

        return "request params is"+name;
    }
    /**以直接量的方式接受请求中的参数(方法中的参数名需要请求参数名相同)
     * http://localhost/doHandleRequestParam02?name=tony&startDate=2020/12/04
     * @RequestParam此注解可以描述方法参数,用于对方法参数进行相关配置
     * 使用词注解描述参数时,默认客户端必须要给它描述的参数传一个值
     * 不传值会400异常
     *
     * @DatetimeFormat 描述日期参数,用于指定可以接收的日期格式 默认为"yyyy-MM-dd HH:mm"
     * */
    @RequestMapping("/doHandleRequestParam02")
    public String doHandleRequestParam02(String name,
                                  @DateTimeFormat(pattern ="yyyy/MM/dd")
                                  @RequestParam(required = true) Date startDate){

        return "request params is"+name+"/startDate="+startDate;
    }

    /**
     * Rest 风格的url定义
     * rest 风格:一种软件架构编码风格,这种风格中定义了url的一种格式,其语法:
     * /a/b/{c}/d/{e},其中{}内部内容为变量,例如
     * 1)a/b/100/d/200
     * 2)a/b/e/d/f
     * 假如在方法中想获取rest url中变量值,使用@PathVariable注解对方法参数进行描述
     * 前提是方法参数名需要与url中的变量相同
     * @param id
     * @return
     */
    @RequestMapping("/doHandleRequestParam03/{id}")
    public String doHandleRequestParam03(@PathVariable Integer id){

        return "request params id="+id ;
    }

    //=============================================================

    /**
     *http://localhost/doHandleRequestParam04?name=yueyue&startDate=1990-03-12
     * @param pojo
     * @return
     */
    @RequestMapping("/doHandleRequestParam04")
    public String doHandleRequestParam04(RequestParameter pojo){
        return "request params"+ pojo.toString();
    }
//======================================================================

    /**
     * http://localhost/doHandleRequestParam04/yueyue/1990-03-12
     * @param pojo
     * @return
     * 当时用pojo对象接收rest风格url中变量的值时,无序使用
     * @PathVariable 对控制层pojo类型参数进行描述
     */
    @RequestMapping("/doHandleRequestParam05/{name}/{startDate}")
public String doHandleRequestParam05(RequestParameter pojo){
    return "request params"+ pojo.toString();
}
//=========================基于map接收请求参数=============================

    /**
     *加入客户端请求参数比较多,但由不想定义pojo接收请求参数,那该如何实现?
     * 借助map可以,但是一般不推荐(map一般无法请求参数进行限制)
     * @param map
     * @return
     * 加入使用
     */
    @RequestMapping("/doHandleRequestParam06")
    public String doHandleRequestParam06(@RequestParam Map<String,Object> map){
        return "request params"+ map.toString();
}

    /**
     * Rest风格url参数
     * @param map
     * @return
     * map接收rest风格中的数据时,需要使用@PathVariable注解对map参数
     * 进行描述.不能使用@RequestParam注解,因此此注解描述的参数只能接收普通url中
     * "?"符号后面定义的参数值
     */
    @RequestMapping("/doHandleRequestParam07/{name}/{startDate}")
    public String doHandleRequestParam07(@PathVariable Map<String,Object> map){
        return "request params"+ map.toString();
    }
}
